iT邦幫忙

2024 iThome 鐵人賽

DAY 2
0

事件溯源 (event sourcing) 是一種保存應用程式狀態的方法:不同於傳統的 RDBMS 資料庫只儲存表格當下的狀態,事件溯源則是將每個對應用程式造成狀態變更的事件加以儲存,所以保存下來的是一連串的事件。

當應用程式需要得知其特定時間點的狀態時,可以從將這些事件加以重播,以重建出該時間點的的狀態。

比較圖

優點

從我個人的觀點,本質上,事件溯源就是一種比只儲存當下狀態更優秀的作法。用一個簡單的類比來講,如果你要保存純文字檔的程式碼,已經知道這個檔案會不停地改動,你會用什麼方式來保存?

git 對吧?事件溯源,就是把 git 的概念做進資料庫裡。

所以,它有三個非常重要的優點:

  1. 資料庫的狀態可以回到過去,因為重新播放事件即可。
  2. 資料庫容易修正錯誤,因為所有的刪除與修改都可以倒回。
  3. 高效率地在不同的節點同步狀態,因為只需不停地傳送更新的事件。

實作上的挑戰

在本系列文的開頭有提到:

某位在教 DDD (domain-driven design) 的老師寫到類似的內容,他開的事件溯源的課程,學員上完課之後,跟他表示,「老師,這個事件溯源,好像不知道要如何應用?」

事件溯源確實不容易實作,因為至少有幾個難點要克服:

  1. 要設法定義出合理的事件的格式,如此事件可以完整地描述造成狀態改變的資訊。
  2. 要設計出一個合理投影 (projection) 方式,讓事件在播放後,投影出某個時間點的資料庫狀態。
  3. 為了讓資料庫的查詢夠快,要在投影出來的表格加上索引

然而,幸運的事情是,如果選用了 Datomic,那上述的三個設計難題,都可以不用考慮,因為 Datomic 都已經設計好了,我們只需要遵循它的設計、又或是呼叫它的 API即可。

其它資源:

  1. 歡迎訂閱PruningSuccess電子報,主要談論軟體開發、資料處理、資料分析等議題。
  2. 歡迎加入Clojure社群

上一篇
序:客戶說我是個異端邪說
下一篇
一些 SQL 資料庫共同的缺陷
系列文
Datomic,內建事件溯源的資料庫。30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言